package Test28;

import java.util.Objects;

//Object类的使用
/*
public string toString()                返回对象的字符串表示形式
public boolean equals(object obj)       比较两个对象是否相等（这个是Object类的equals方法，区别开和字符串里面的equals方法）
protected object clone(int a)           对象克隆

 */
public class Test09 {
    public static void main(String[] args) {

        //1、toString方法
        Object obj = new Object();
        String str1 = obj.toString();
        System.out.println(str1);

        Student09 stu = new Student09();
        String str2 = stu.toString();
        System.out.println(str2);
        //细节:
        //system:类名
        //out:静态变量
        //system.out:获取打印的对象
        //println( ):方法
        //参数:表示打印的内容核心逻辑:
        //当我们打印一个对象的时候，底层会调用对象的toString方法，把对象变成字符串。
        //然后再打印在控制台上，打印完毕换行处理。

        //思考：默认情况下，因为object类中的toString方法返回的是地址值
        //所以，默认情况下，打印一个对象打印的就是地址值
        //但是地址值对于我们是没什么意义的?
        //我想要看到对象内部的属性值?我们该怎么办?
        //处理方案:重写父类object类中的toString方法

        System.out.println(stu);
        //toString方法的结论:
        //如果我们打印一个对象，想要看到属性值的话，那么就重写toString方法就可以了。
        //在重写的方法中，把对象的属性值进行拼接。

        System.out.println("----------------------------------");

        //2、equals方法
        Student09 s1 = new Student09("zhangsan", 23);
        Student09 s2 = new Student09("zhangsan", 23);

        boolean result1 = s1.equals(s2);
        System.out.println(result1);

        //结论:
        //1.如果没有重写equals方法，那么默认使用object中的方法进行比较，比较的是地址值是否相等
        //2.一般来讲地址值对于我们意义不大，所以我们会重写，重写之后比较的就是对象内部的属性值了。

        String s = "abc";
        StringBuilder sb = new StringBuilder("abc");
        System.out.println(s.equals(sb));//false
        //因为equals方法是被s调用的，而s是字符串
        //所以equals要看String类中的
        //字符串中的equals方法，先判断参数是否为字符串
        //如果是字符串，再比较内部的属性
        //但是如果不是字符串，直接返回false

        System.out.println(sb.equals(s));
        //因为equals方法是被sb调用的，而sb是StringBuilder
        //所以这里的equals方法要看StringBuilder中的equals方法
        //那么在StringBuilder中，没有重写equals方法
        //故使用的是父类Object类中的equals方法
        //在Object当中默认是使用==号比较两个对象的地址值
        //而这里的s和sb记录的地址值是不一样的，所以结果返回false

    }
}


class Student09 {

    private String name;
    private int age;

    public Student09() {
    }

    public Student09(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //在JavaBean类中重写同toString方法
    public String toString() {
        return "Student09{name = " + name + ", age = " + age + "}";
    }

    //重写之后的equals方法比较的就是对象内部的属性值了。
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student09 student09 = (Student09) o;
        return age == student09.age && Objects.equals(name, student09.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
